﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Autocentro.Entities;
using Autocentro.BussinesLogic;
using Microsoft.Practices.Unity;

namespace Autocentro.UI
{
    public partial class FrmCartillaPrecio : Form
    {
        [Dependency]
        public IEmpresaBL empresabl { get; set; }

        [Dependency]
        public IProductoBL productobl { get; set; }

        [Dependency]
        public ITipoVehiculoBL tipovehiculobl { get; set; }

        [Dependency]
        public IProductoTipoVehiculoBL productotipovehiculobl { get; set; }

        public FrmCartillaPrecio()
        {
            InitializeComponent();
            this.BuildUp();
        }

        private void CargarData()
        {
            eMPRESABindingSource.DataSource = empresabl.GetAllFromEmpresa();
            pRODUCTOBindingSource.DataSource = productobl.GetAllFromPrductos();
            var _empresa = eMPRESABindingSource.Current as EMPRESA;
            tIPO_VEHICULOBindingSource.DataSource = tipovehiculobl.GetAllFromTipoVehiculoByEmpresaId(_empresa.Id);
        }

        private void FrmCartillaPrecio_Load(object sender, EventArgs e)
        {
            CargarData();
        }

        private void btnNuevo_Click(object sender, EventArgs e)
        {
            var frm = new FrmMttoEmpresa();
            frm.Nuevo();
            frm.ShowDialog();
            CargarData();
        }

        private void btnEditar_Click(object sender, EventArgs e)
        {
            var _empresa = eMPRESABindingSource.Current as EMPRESA;
            if (_empresa != null)
            {
                var frm = new FrmMttoEmpresa();
                frm.CurrentEmpresa = _empresa;
                frm.Editar();
                frm.ShowDialog();
                CargarData();
            }
            else
            {
                MessageBox.Show("Debe de seleccionar item");
            }
        }

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            eMPRESABindingSource.DataSource = empresabl.GetFromEmpresaByDescripcion(txtCriterio.Text);
        }

        private void BtnBuscarProductos_Click(object sender, EventArgs e)
        {
            pRODUCTOBindingSource.DataSource = productobl.GetFromProductosByCriterio(TxtCriterioProducto.Text);
        }

        private void TxtCriterioProducto_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                pRODUCTOBindingSource.DataSource = productobl.GetFromProductosByCriterio(TxtCriterioProducto.Text);
            }
        }

        private void txtCriterio_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                eMPRESABindingSource.DataSource = empresabl.GetFromEmpresaByDescripcion(txtCriterio.Text);
            }
        }

        private void BtnNuevoProducto_Click(object sender, EventArgs e)
        {
            var frmProducto = new FrmMttProducto();
            frmProducto.AddProducto();
            frmProducto.ShowDialog();
            CargarData();
        }

        private void btnNuevoServicio_Click(object sender, EventArgs e)
        {
            var frmServicio = new FrmMttServicio();
            frmServicio.AddServicio();
            frmServicio.ShowDialog();
            CargarData();
        }

        private void BtnEditarProductos_Click(object sender, EventArgs e)
        {
            var updateProducto = pRODUCTOBindingSource.Current as PRODUCTO;
            if (updateProducto != null)
            {
                if (updateProducto.ProductoServicio == true)
                {
                    var servicioM = new FrmMttServicio();
                    servicioM._servicio = updateProducto;
                    servicioM.UpdateServicio();
                    servicioM.ShowDialog();
                    CargarData();
                }
                else
                {
                    var frmProducto = new FrmMttProducto();
                    frmProducto.producto = updateProducto;
                    frmProducto.UpdateProducto();
                    frmProducto.ShowDialog();
                    CargarData();
                }
            }
            else
            {
                MessageBox.Show("Debe de seleccionar un Producto o Servicio");
            }
        }

        private void eMPRESABindingSource_CurrentChanged(object sender, EventArgs e)
        {
            var _empresa = eMPRESABindingSource.Current as EMPRESA;
            //pRODUCTO_EMPRESABindingSource.DataSource = _empresa.PRODUCTO_EMPRESA;
            //pRODUCTO_EMPRESABindingSource.DataSource = productoempresabl.GetAllFromProductoEmpresaByEmpresaId(_empresa.Id);
            tIPO_VEHICULOBindingSource.DataSource = tipovehiculobl.GetAllFromTipoVehiculoByEmpresaId(_empresa.Id);
            pRODUCTO_TIPO_VEHICULOBindingSource.ResetBindings(true);
            //var _tipovehiculo = tIPO_VEHICULOBindingSource.Current as TIPO_VEHICULO;
            //if (_tipovehiculo != null)
            //{
            //    pRODUCTO_TIPO_VEHICULOBindingSource.DataSource = productotipovehiculobl.GetAllFromProductoTipoVehiculoByTipoVehiculo(_tipovehiculo.Id);    
            //}
            
        }

        private void BtnAgregar_Click(object sender, EventArgs e)
        {
            var _empresa = eMPRESABindingSource.Current as EMPRESA;
            var _producto = pRODUCTOBindingSource.Current as PRODUCTO;
            var _tipovehiculo = tIPO_VEHICULOBindingSource.Current as TIPO_VEHICULO;

            ////_empresa.PRODUCTO_EMPRESA = productoempresabl.GetAllFromProductoEmpresaByEmpresaId(_empresa.Id);

            ////pRODUCTO_EMPRESABindingSource.DataSource = productoempresabl.GetAllFromProductoEmpresaByEmpresaId(_empresa.Id);

            if (_tipovehiculo != null)
            {
                var _productotipovehiculo = new PRODUCTO_TIPO_VEHICULO()
                {
                    TipoVehiculoId = _tipovehiculo.Id,
                    ProductoId = _producto.Id,
                    Precio = _producto.Costo,
                    PRODUCTO = _producto
                };

                var existe = _tipovehiculo.PRODUCTO_TIPO_VEHICULO.Where(dv => dv.ProductoId.Equals(_producto.Id)).SingleOrDefault();

                if (existe == null)
                {
                    _tipovehiculo.PRODUCTO_TIPO_VEHICULO.Add(_productotipovehiculo);

                    foreach (var item in _empresa.TIPO_VEHICULO)
                    {
                        if (item.Id == _tipovehiculo.Id)
                        {
                            item.PRODUCTO_TIPO_VEHICULO.Add(_productotipovehiculo);
                        }
                    }
                }
                else
                {
                    var rpt = MessageBox.Show(this, string.Format("El Item ya se encuentra activo"),
                                      "Mensaje", MessageBoxButtons.OK);
                }

                tIPO_VEHICULOBindingSource.ResetBindings(true);
                pRODUCTO_TIPO_VEHICULOBindingSource.ResetBindings(true);
            }
            else
            {
                MessageBox.Show(this, string.Format("Debe seleccionar un tipo de vehiculo para asignar producto"),
                                                     "Mensaje", MessageBoxButtons.OK);
            }
        
        }

        private void BtnQuitar_Click(object sender, EventArgs e)
        {
            var _empresa = eMPRESABindingSource.Current as EMPRESA;
            var _productotipovehiculo= pRODUCTO_TIPO_VEHICULOBindingSource.Current as PRODUCTO_TIPO_VEHICULO;
            var _tipovehiculo = tIPO_VEHICULOBindingSource.Current as TIPO_VEHICULO;

            if (_productotipovehiculo != null)
            {
                if (_productotipovehiculo.Id == 0)
                {
                    _tipovehiculo.PRODUCTO_TIPO_VEHICULO.Remove(_productotipovehiculo);
                    foreach (var item in _empresa.TIPO_VEHICULO)
                    {
                        if (item.Id == _tipovehiculo.Id)
                        {
                            item.PRODUCTO_TIPO_VEHICULO.Remove(_productotipovehiculo);
                            
                        }
                    }
                }
                else
                {
                    var rpta = MessageBox.Show("Este item ya se encuentra guardado, ¿Seguro que desea Eliminarlo?", "Mensaje", MessageBoxButtons.YesNo, MessageBoxIcon.Information);

                    if (rpta == DialogResult.Yes)
                    {
                        _tipovehiculo.PRODUCTO_TIPO_VEHICULO.Remove(_productotipovehiculo);

                        foreach (var item in _empresa.TIPO_VEHICULO)
                        {
                            if (item.Id == _tipovehiculo.Id)
                            {
                                item.PRODUCTO_TIPO_VEHICULO.Remove(_productotipovehiculo);
                                
                            }
                        }
                        productotipovehiculobl.RemoveProductoTipoVehiculo(_productotipovehiculo.Id);
                        pRODUCTO_TIPO_VEHICULOBindingSource.ResetBindings(true);
                        
                    }
                }

                pRODUCTO_TIPO_VEHICULOBindingSource.ResetBindings(true);
                tIPO_VEHICULOBindingSource.ResetBindings(true);
                
            }
            else
            {
                MessageBox.Show(this, string.Format("Debe seleccionar un producto de la cartera de precios"),
                                                "Mensaje", MessageBoxButtons.OK);
            }
        }

        private void btnGuardar_Click(object sender, EventArgs e)
        {
            var _tipovehiculo = tIPO_VEHICULOBindingSource.List;
            var _empresa = eMPRESABindingSource.List;
            var msg = "ERROR";


            foreach (EMPRESA empresa in _empresa)
            {
                foreach (var tipovehiculo in empresa.TIPO_VEHICULO)
                {
                    foreach (var item in tipovehiculo.PRODUCTO_TIPO_VEHICULO)
                    {
                        if (item.Id == 0)
                        {
                            try
                            {
                                productotipovehiculobl.AddProductoTipoVehiculo(item);
                                RecoveryEntities(item);
                            }
                            catch (Exception ex)
                            {
                                msg = ex.Message;
                                MessageBox.Show(msg, "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            }
                        }
                        else
                        {
                            try
                            {
                                productotipovehiculobl.UpdateProductoTipoVehiculo(item);
                                RecoveryEntities(item);
                            }
                            catch (Exception ex)
                            {
                                msg = ex.Message;
                                MessageBox.Show(msg, "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            }
                        }
                    }
                }
            }
            MessageBox.Show("Registro Correcto", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
            

        private void RecoveryEntities(PRODUCTO_TIPO_VEHICULO item)
        {
            item.PRODUCTO = productobl.GetFromProductoByID(item.ProductoId);
            item.TIPO_VEHICULO = tipovehiculobl.GetFromTipoVehiculoById(item.TipoVehiculoId);
        }

        private void BtnBuscarProductoEmpresa_Click(object sender, EventArgs e)
        {
            var  _tipovehiculo = tIPO_VEHICULOBindingSource.Current as TIPO_VEHICULO;

            if (_tipovehiculo.PRODUCTO_TIPO_VEHICULO != null)
            {
                 if (TxtCriterioProductoEmpresa.Text != string.Empty)
                {
                    var existe = _tipovehiculo.PRODUCTO_TIPO_VEHICULO.Where(dv => dv.PRODUCTO.Descripcion.ToUpper().Contains(TxtCriterioProductoEmpresa.Text.ToUpper())).ToList();
                    pRODUCTO_TIPO_VEHICULOBindingSource.DataSource = existe;
                }
                else
                {
                    pRODUCTO_TIPO_VEHICULOBindingSource.DataSource = _tipovehiculo.PRODUCTO_TIPO_VEHICULO;
                    pRODUCTO_TIPO_VEHICULOBindingSource.ResetBindings(true);
                }
            }
        }

        private void TxtCriterioProductoEmpresa_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
               var  _tipovehiculo = tIPO_VEHICULOBindingSource.Current as TIPO_VEHICULO;

                if (_tipovehiculo.PRODUCTO_TIPO_VEHICULO != null)
                {
                     if (TxtCriterioProductoEmpresa.Text != string.Empty)
                    {
                        var existe = _tipovehiculo.PRODUCTO_TIPO_VEHICULO.Where(dv => dv.PRODUCTO.Descripcion.ToUpper().Contains(TxtCriterioProductoEmpresa.Text.ToUpper())).ToList();
                        pRODUCTO_TIPO_VEHICULOBindingSource.DataSource = existe;
                    }
                    else
                    {
                        pRODUCTO_TIPO_VEHICULOBindingSource.DataSource = _tipovehiculo.PRODUCTO_TIPO_VEHICULO;
                        pRODUCTO_TIPO_VEHICULOBindingSource.ResetBindings(true);
                    }
                }
        
             }
        }

        private void BtnBuscarTVehiculo_Click(object sender, EventArgs e)
        {
            var _empresa = eMPRESABindingSource.Current as EMPRESA;

            if (_empresa != null)
            {
                tIPO_VEHICULOBindingSource.DataSource = tipovehiculobl.GetFromTipoVehiculoByDescripcionAndEmpresaId(TxtTipoVehiculo.Text, _empresa.Id);
            }
        }

        private void BtnNuevoTVehiculo_Click(object sender, EventArgs e)
        {
            var frm = new FrmMttoTipoVehiculo();
            frm.Nuevo();
            frm.ShowDialog();
            CargarData();
        }

        private void BtnEditarTVehiculo_Click(object sender, EventArgs e)
        {
             var _tipovehiculo = tIPO_VEHICULOBindingSource.Current as TIPO_VEHICULO;
            if (_tipovehiculo != null)
            {
                var frm = new FrmMttoTipoVehiculo();
                frm.CurrentTipoVehiculo = _tipovehiculo;
                frm.Editar();
                frm.ShowDialog();
                CargarData();
            }
            else
            {
                MessageBox.Show("Debe de seleccionar item");
            }
        }

        private void tIPO_VEHICULOBindingSource_CurrentChanged(object sender, EventArgs e)
        {
            var _tipovehiculo = tIPO_VEHICULOBindingSource.Current as TIPO_VEHICULO;

            if (_tipovehiculo != null)
            {
                pRODUCTO_TIPO_VEHICULOBindingSource.DataSource = _tipovehiculo.PRODUCTO_TIPO_VEHICULO;    
            }
            
        }          
    }
}
